#!/bin/bash

# 压缩目录下所有子目录的脚本
# 将每个子目录压缩为独立的zip文件并生成统计信息

# 配置参数
OUTPUT_DIR="compressed_output"          # 压缩包输出目录
STATISTICS_FILE="compression_stats.txt" # 统计文件名

# 支持的图片文件扩展名
IMAGE_EXTENSIONS=("jpg" "jpeg" "png" "gif" "bmp" "tiff" "tif" "arw" "nef" "cr2" "dng" "orf" "rw2" "pef" "sr2" "srf" "mrw")

# 定义目录列表数组
directories=(
    "2024"
    # 可以添加更多目录，例如：
    # "2024"
    # "projects"
    # "backup"
)

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 创建输出目录
mkdir -p "$OUTPUT_DIR"

# 初始化统计文件（使用绝对路径）
STATS_PATH="$SCRIPT_DIR/$OUTPUT_DIR/$STATISTICS_FILE"
echo "压缩统计报告" > "$STATS_PATH"
echo "生成时间: $(date)" >> "$STATS_PATH"
echo "========================================" >> "$STATS_PATH"
echo "" >> "$STATS_PATH"

# 函数：检查文件是否为图片
is_image_file() {
    local filename="$1"
    local extension="${filename##*.}"
    extension=$(echo "$extension" | tr '[:upper:]' '[:lower:]')

    for ext in "${IMAGE_EXTENSIONS[@]}"; do
        if [[ "$extension" == "$ext" ]]; then
            return 0
        fi
    done
    return 1
}

# 函数：获取目录大小（仅计算图片文件）
get_images_size() {
    local dir_path="$1"
    local total_size=0

    for file in "$dir_path"/*; do
        if [ -f "$file" ] && is_image_file "$(basename "$file")"; then
            size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null || echo 0)
            total_size=$((total_size + size))
        fi
    done

    echo $total_size
}

# 函数：格式化文件大小
format_size() {
    local bytes=$1
    if [ $bytes -ge 1073741824 ]; then
        echo "$(( bytes / 1073741824 ))GB"
    elif [ $bytes -ge 1048576 ]; then
        echo "$(( bytes / 1048576 ))MB"
    elif [ $bytes -ge 1024 ]; then
        echo "$(( bytes / 1024 ))KB"
    else
        echo "${bytes}B"
    fi
}

# 遍历目录列表
for dir in "${directories[@]}"; do
    # 检查目录是否存在
    if [ ! -d "$dir" ]; then
        echo "警告: 目录 '$dir' 不存在，跳过..."
        continue
    fi

    echo "正在处理目录: $dir"

    # 在统计文件中添加目录标题
    echo "目录: $dir" >> "$STATS_PATH"
    echo "----------------------------------------" >> "$STATS_PATH"

    # 进入目标目录
    cd "$dir" || {
        echo "错误: 无法进入目录 '$dir'"
        continue
    }

    # 遍历当前目录下的所有子目录
    for subdir in */; do
        # 去掉末尾的斜杠，获取子目录名
        subdir_name="${subdir%/}"

        # 确保它确实是一个目录
        if [ -d "$subdir_name" ]; then
            zip_file="$subdir_name.zip"
            output_zip_path="../$OUTPUT_DIR/$zip_file"

            echo "  正在压缩: $subdir_name -> $output_zip_path"

            # 压缩子目录到输出目录
            zip -r "$output_zip_path" "$subdir_name"

            if [ $? -eq 0 ]; then
                echo "  ✓ 压缩完成: $zip_file"

                # 获取子目录中的图片文件列表和大小
                image_files=()
                subdir_path="$subdir_name"

                # 递归查找图片文件
                while IFS= read -r -d '' file; do
                    image_files+=("$(basename "$file")")
                done < <(find "$subdir_path" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.bmp" -o -iname "*.tiff" -o -iname "*.tif" -o -iname "*.arw" -o -iname "*.nef" -o -iname "*.cr2" -o -iname "*.dng" -o -iname "*.orf" -o -iname "*.rw2" -o -iname "*.pef" -o -iname "*.sr2" -o -iname "*.srf" -o -iname "*.mrw" \) -print0)

                # 计算图片文件总大小
                image_size=$(get_images_size "$subdir_path")

                # 写入统计信息
                echo "  子目录: $subdir_name" >> "$STATS_PATH"
                echo "    压缩包: $zip_file" >> "$STATS_PATH"
                echo "    图片文件数量: ${#image_files[@]}" >> "$STATS_PATH"
                echo "    图片文件总大小: $(format_size $image_size)" >> "$STATS_PATH"

                if [ ${#image_files[@]} -gt 0 ]; then
                    echo "    图片文件列表:" >> "$STATS_PATH"
                    for img_file in "${image_files[@]}"; do
                        echo "      - $img_file" >> "$STATS_PATH"
                    done
                else
                    echo "    (无图片文件)" >> "$STATS_PATH"
                fi
                echo "" >> "$STATS_PATH"

            else
                echo "  ✗ 压缩失败: $subdir_name"
                echo "  子目录: $subdir_name - 压缩失败" >> "$STATS_PATH"
                echo "" >> "$STATS_PATH"
            fi
        fi
    done

    # 返回上级目录
    cd ..

    echo "完成处理目录: $dir"
    echo "----------------------------------------"
    echo "" >> "$STATS_PATH"
done

echo "========================================" >> "$STATS_PATH"
echo "统计完成时间: $(date)" >> "$STATS_PATH"
echo ""
echo "所有目录处理完成！"
echo "压缩包位置: $OUTPUT_DIR/"
echo "统计文件: $OUTPUT_DIR/$STATISTICS_FILE"